home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / tset / tset.c < prev    next >
C/C++ Source or Header  |  1991-10-18  |  4KB  |  210 lines

  1. /*
  2.     TSET.EXE Ver 0.04  1991.07.24  by Y.Kurihara (Nifty PDC01620)
  3.         環境変数操作コマンド (TownsOS用)
  4.  
  5.     (1) Tset [-c] <環境変数>=<値>
  6.     (2) Tset [-c] <環境変数>=
  7.     (3) Tset [-c] @<ファイル名>
  8.     (4) Tset [-c]
  9.     (5) Tset [-c] =
  10.  
  11.     (1) 環境変数を設定する
  12.     (2) 環境変数を削除する
  13.     (3) 環境設定ファイルを読み込む
  14.     (4) 環境変数を表示する
  15.     (5) 環境変数領域+1バイトを表示する(デバック用)
  16.  
  17.     オプション -c  CONTROL.EXE の環境を操作する。
  18.  
  19.     このプロクラムは LSI C-86 Ver 3.20 試食版 で作成しました。
  20. */
  21.  
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include <dos.h>
  26. #include <farstr.h>
  27. #include "environ.h"
  28.  
  29. #define  MAXbuffer (256)
  30.  
  31. void envlst( int env )                    /* 環境変数の出力 */
  32. {
  33.     char far *ptr;
  34.  
  35.     if( !env )  return;
  36.     ptr = MK_FP( env,0 );
  37.     while( *ptr ) {
  38.         while( *ptr )  putchar( *ptr++ );
  39.         putchar( '\n' );
  40.         ptr++;
  41.     }
  42. }
  43.  
  44. void envdmp( int env )                    /* 環境変数のダンプ */
  45. {
  46.     char far *ptr;
  47.     unsigned size,n;
  48.  
  49.     if( !env )  return;
  50.     ptr  = MK_FP( env,0 );
  51.     size = MCB_size( env ) * 16;
  52.     printf( "%04x:0000 - %04x\n",env,size - 1 );
  53.     for( n = 0; n <= size ; n++ ) {
  54.         if( ptr[n] >= ' ' ) {
  55.             putchar( ptr[n] );
  56.         } else {
  57.             putchar( '^' );
  58.             putchar( ptr[n] + '@' );
  59.         }
  60.     }
  61.     putchar( '\n' );
  62.     putchar( '\n' );
  63. }
  64.  
  65. char *getcmd( void )                /* PSPのコマンドラインを取得 */
  66. {
  67.     static char buff[ MAXbuffer + 1 ];
  68.     char far *ptr,*p = buff;
  69.  
  70.     ptr = MK_FP( _psp,0x81 );
  71.     while( *ptr && *ptr != 0x0d )  *p++ = *ptr++;
  72.     *p = 0;
  73.     return( buff );
  74. }
  75.  
  76. int prgpsp( char *prgname )            /* プログラムのPSPを得る */
  77. {
  78.     int env,mem;
  79.     char *name,*p;
  80.     
  81.     mem = getrpid();
  82.     while( MCB_mark( mem ) == 'M' ) {
  83.         mem = MCB_next( mem );
  84.         if( MCB_owner( mem ) != mem )  continue;
  85.         if( ( env = pspenv( mem ) ) == 0 )  continue;
  86.         if( ( name = envpath( env ) ) == NULL )  continue;
  87.         for( p = name; *p; p++ )  if( *p == ':' )   name = p + 1;
  88.         for( p = name; *p; p++ )  if( *p == '\\' )  name = p + 1;
  89.         if( stricmp( prgname,name ) )  continue;
  90.         return( mem );
  91.     }
  92.     return  0;
  93. }
  94.  
  95. int getControlEnv( void )            /* CONTROL.EXEの環境変数領域 */
  96. {
  97.     unsigned psp1,psp2,env;
  98.  
  99.     psp1 = prgpsp( "CONTROL.EXE" );
  100.     psp2 = prgpsp( "T_OAK2.EXE" );
  101.  
  102.     if( psp2 == 0 )  goto error2;
  103.     if( psp1 ) {
  104.         if( psp1 != PSP_parent( psp2 ) ) goto error3;
  105.     } else {
  106.         if( ( psp1 = PSP_parent( psp2 ) ) == 0 )  goto error3;
  107.         if( ( env  = pspenv( psp1 ) ) == 0 )  goto error3;
  108.         if( envpath( env ) != NULL )  goto error3;
  109.     }
  110.     env = pspenv( psp1 );
  111.     if( env == 0 )  goto error1;
  112.     return( env );
  113.  
  114. error1:
  115.     puts( "\"CONTROL.EXE\"が見つからない。" );
  116.     exit( 1 );
  117. error2:
  118.     puts( "\"T_OAK2.EXE\"が見つからない。" );
  119.     exit( 1 );
  120. error3:
  121.     puts( "\"T_OAK2.EXE\"の親プロセスが\"CONTROL.EXE\"ではない。" );
  122.     exit( 1 );
  123. }
  124.  
  125. void tset( char *cmd,int env )                /* 環境変数の設定 */
  126. {
  127.     char *var;
  128.  
  129.     var = cmd;
  130.     while( *cmd && *cmd != '=' )  cmd++;
  131.     if( *cmd == 0 )  goto error1;
  132.     *cmd++ = 0;
  133.  
  134.     if( envset( var,cmd,env ) )  goto error2;
  135.     return;
  136.  
  137. error1:
  138.     puts( "書式が間違っている。" );
  139.     return;
  140. error2:
  141.     puts( "環境変数領域が不足している。" );
  142.     return;
  143. }
  144.  
  145. int far handler(unsigned deverror, unsigned errcode,unsigned far *devhdr)
  146. {                            /* int 24h の処理 */
  147.     return( _HARDERR_FAIL );
  148. }
  149.  
  150. void envrd( int env,char *file )            /* 環境変数のロード */
  151. {
  152.     int c,n = 0;
  153.     char buf[ MAXbuffer + 1 ];
  154.     FILE *fp;
  155.  
  156.     _harderr( handler );
  157.     fp = fopen( file,"r" );
  158.     if( fp == NULL ) {
  159.         puts( "ファイルがオープンできない。" );
  160.         exit( 1 );
  161.     }
  162.  
  163.     while( c = getc( fp ),c != EOF ) {
  164.         if( c == '\n' ) {
  165.             buf[ n ] = 0;
  166.             tset( buf,env );
  167.             n = 0;
  168.         } else if( n < MAXbuffer ) {
  169.             buf[ n++ ] = c;
  170.         }
  171.     }
  172.     fclose( fp );
  173.     exit( 0 );
  174. }
  175.  
  176. main( int argc,char **argv )
  177. {
  178.     char *cmd;
  179.     int env;
  180.  
  181.     env = pspenv( getcpid() );
  182.     if( env == 0 ) {
  183.         puts( "環境変数領域が見つからない。" );
  184.         exit( 1 );
  185.     }
  186.     cmd = getcmd();
  187.     while( *cmd == ' ' || *cmd == '\t' )  cmd++;
  188.     if( cmd[0] == '-' ) {
  189.         if( cmd[1] == 'C' || cmd[1] == 'c' ) {
  190.             env = getControlEnv();
  191.         } else if( cmd[1] == 'R' || cmd[1] == 'r' ) {
  192.             env = pspenv( getrpid() );
  193.         }
  194.         cmd += 2;
  195.         while( *cmd == ' ' || *cmd == '\t' )  cmd++;
  196.     }
  197.  
  198.     if( *cmd == 0 ) {
  199.         envlst( env );
  200.     } else if( cmd[0] == '=' ) {
  201.         envdmp( env );
  202.     } else if( cmd[0] == '@' ) {
  203.         envrd( env,cmd + 1 );
  204.     } else {
  205.         tset( cmd,env );
  206.     }
  207.     exit( 0 );
  208. }
  209.  
  210.